Introduction
This report explores the dataframes from April 2016 (sense_my_feup.Rmd). The data is soon filtered to consider only points in the Porto square. Finally, it concludes the main edges for better evaluation in the next chapters.
Index:
- Data setup
- Intersession time
- Mapping
- Sessions
- Speed
- Time series (first attempt)
SenseMyFEUP data
Data loading
Data used is previously filtered by travelmode (car and bus) and date (April 2016).
We filter our data to consider only points in a square of the Porto Metropolitan area.
Intersession times
This section explores the time between different sessions in the same edge.
### Intersession times and number of sessions.
All intersession time Porto April16. This figure shows that most of the edges have an intersession time greater than 1 hour.
Intersession time along the week. Here we can see that weekends have an intersession time way bigger than weekdays, this could be caused by users going out of Porto on the weekends, reaching out our frontier.
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
Number of sessions per edge. We can see the limitations in our data when most of the edges have less than 5 sessions in the whole month, mostly even having just 1. In next chapters we will study more the edges with more than 50 sessions.
Analizing edges >50 sessions.
- hotedges -> more 50 sessions. 3537 sessions in total.
- superhot_edges -> more 170 sessions. 1369 sessions in total.
Points (probably to delete)
This section is needed to then map. Maps the amount of points. It is better to map with number of sessions.
ECDF
Only 25% is under 1h intersession time.
As expected, there is higher intersession time at night.
ECDF by #sessions

Edges with >50 sessions.
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Removed 248 rows containing non-finite values (stat_bin).
Showing maps
Traffic Map April Porto 2016 all
Traffic Map April 2016 all >50
Top edges
Number of sessions analysis.
Day of the week
Scale for 'x' is already present. Adding another scale for 'x', which will replace the existing scale.

By day
Scale for 'x' is already present. Adding another scale for 'x', which will replace the existing scale.

By hour

Speed >50

Speed by week

Speed by day

Speed by hour
Number of session per hour
Edges per half hour
prueba <- table(cut(filter(df_hotedges_april16pt, day(time) < 7)$time, breaks = "30 mins"))
plot(prueba, xlab = "date", ylab = "frequency")
LS0tCnRpdGxlOiAnU2Vuc2UgTXkgRkVVUCAtIEFwcmlsIDIwMTYgRGF0YScKYXV0aG9yOiAiRGFuaWVsYSBTLiBHaWwiCmRhdGU6IDI1LTA4LTIwMTcKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBJbnRyb2R1Y3Rpb24gCgpUaGlzIHJlcG9ydCBleHBsb3JlcyB0aGUgZGF0YWZyYW1lcyBmcm9tIEFwcmlsIDIwMTYgKHNlbnNlX215X2ZldXAuUm1kKS4KVGhlIGRhdGEgaXMgc29vbiBmaWx0ZXJlZCB0byBjb25zaWRlciBvbmx5IHBvaW50cyBpbiB0aGUgUG9ydG8gc3F1YXJlLiAKRmluYWxseSwgaXQgY29uY2x1ZGVzIHRoZSBtYWluIGVkZ2VzIGZvciBiZXR0ZXIgZXZhbHVhdGlvbiBpbiB0aGUgbmV4dCBjaGFwdGVycy4gCgojIyMjIEluZGV4OiAKCiAgKiBEYXRhIHNldHVwIAogICogSW50ZXJzZXNzaW9uIHRpbWUKICAqIE1hcHBpbmcgCiAgKiBTZXNzaW9ucyAKICAqIFNwZWVkCiAgKiBUaW1lIHNlcmllcyAoZmlyc3QgYXR0ZW1wdCkKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7ciBlY2hvID0gRkFMU0UsIGV2YWw9RkFMU0V9CnNhdmUuaW1hZ2UoIlNlbnNlbXlXb3JrU3BhY2UuUkRhdGEiKQojbG9hZCgiZGZfZmlyc3Rfc2Vzc2lvbl9jYXJzX2FwcmlsMTYuUmRhIikKbG9hZCgiU2Vuc2VteVdvcmtTcGFjZS5SRGF0YSIpCnNvdXJjZSgiLi4vZnVuY3Rpb25zL2NvbXBhcmluZ19lZGdlc19sZXZlbC5SIikKYGBgCgoKIyBTZW5zZU15RkVVUCBkYXRhCgojIyBEYXRhIGxvYWRpbmcKIERhdGEgdXNlZCBpcyBwcmV2aW91c2x5IGZpbHRlcmVkIGJ5IHRyYXZlbG1vZGUgKGNhciBhbmQgYnVzKSBhbmQgZGF0ZSAoQXByaWwgMjAxNikuICAgICAgCiBXZSBmaWx0ZXIgb3VyIGRhdGEgdG8gY29uc2lkZXIgb25seSBwb2ludHMgaW4gYSBzcXVhcmUgb2YgdGhlIFBvcnRvIE1ldHJvcG9saXRhbiBhcmVhLiAKIApgYGB7ciBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQojRmlsdGVyaW5nIGJ5IHJlY3RhbmdsZSBpbiBQb3J0byAKCmRmX2VkZ2VzX2FwcmlsMTYgPC0gZGZfc3BlZWQKCmRmX2VkZ2VzX2FwcmlsMTZwdCA8LSBkZl9zcGVlZCAlPiUgCiAgZmlsdGVyKGxhdCA8IDQxLjE4NTkzNTI4MDgxNTUsIGxhdCA+IDQxLjEzNjQ3MjY1NDYsIGxvbiA+IC04LjY5MTI5NDA2ODE0MDUsIGxvbiA8IC04LjU1Mzk2OTM0MjI4KQpgYGAKCiMjIEludGVyc2Vzc2lvbiB0aW1lcwogIFRoaXMgc2VjdGlvbiBleHBsb3JlcyB0aGUgdGltZSBiZXR3ZWVuIGRpZmZlcmVudCBzZXNzaW9ucyBpbiB0aGUgCnNhbWUgZWRnZS4gIAojIyMgSW50ZXJzZXNzaW9uIHRpbWVzIGFuZCBudW1iZXIgb2Ygc2Vzc2lvbnMuCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CgojIFRyYW5zZm9ybWluZyBzZWNvbmRzIHRvIHRpbWVzdGFtcCAKCmRmX2VkZ2VzX2FwcmlsMTZwdCR0aW1lIDwtIGFzLlBPU0lYY3QoZGZfZWRnZXNfYXByaWwxNnB0JHNlY29uZHMsIG9yaWdpbj0iMTk3MC0wMS0wMSIpCmRmX3NwZWVkX3RvcCR0aW1lIDwtIGFzLlBPU0lYY3QoZGZfc3BlZWRfdG9wJHNlY29uZHMsIG9yaWdpbj0iMTk3MC0wMS0wMSIpCmRmX3NwZWVkJHRpbWUgPC0gYXMuUE9TSVhjdChkZl9zcGVlZCRzZWNvbmRzLCBvcmlnaW49IjE5NzAtMDEtMDEiKQoKIyBHZXR0aW5nIGRhdGEgZnJvbSBkZl9zcGVlZAoKZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCA8LSBkZl9lZGdlc19hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KHdheV9pZCwgc2Vzc2lvbl9pZCkgJT4lIAogIHN1bW1hcmlzZShzZWNvbmRzID0gbWluKHNlY29uZHMpKQoKIyBDYWxjdWxhdGluZyBpbnRlcnNlc3Npb24gdGltZS4KCmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgPC0gZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAgJT4lCiAgYXJyYW5nZShkZXNjKHdheV9pZCksIHRpbWUpICU+JSAKICBtdXRhdGUoaW50ZXJzZXNzaW9uX3RpbWUgPSBjKDAsYXMubnVtZXJpYyhkaWZmKHRpbWUpLCB1bml0cz0ibWlucyIpKSkKCmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQkdGltZSA8LSBhcy5QT1NJWGN0KGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQkc2Vjb25kcywgb3JpZ2luPSIxOTcwLTAxLTAxIikKCmBgYAoKQWxsIGludGVyc2Vzc2lvbiB0aW1lIFBvcnRvIEFwcmlsMTYuIApUaGlzIGZpZ3VyZSBzaG93cyB0aGF0IG1vc3Qgb2YgdGhlIGVkZ2VzIGhhdmUgYW4gaW50ZXJzZXNzaW9uIHRpbWUgZ3JlYXRlciB0aGFuIDEgaG91ci4KYGBge3IgZWNobz1GQUxTRX0KcGxvdF9seSh5ID0gZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCRpbnRlcnNlc3Npb25fdGltZSwgdHlwZSA9ICJib3giLCBuYW1lID0gIkFsbCB3YXlfaWRzIikgJT4lIAogIGFkZF9ib3hwbG90KHk9IGZpbHRlcihkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0LCBpbnRlcnNlc3Npb25fdGltZSAhPSAwICkkaW50ZXJzZXNzaW9uX3RpbWUsIG5hbWUgPSAiQXQgbGVhc3QgMiBzZXNzaW9ucyIpICU+JSAKICBsYXlvdXQodGl0bGU9IkludGVyc2Vzc2lvbiB0aW1lIChtaW5zKSIsIHlheGlzID0gbGlzdChyYW5nZSA9IGMoMCw1MDAwKSkpCgpgYGAKCkludGVyc2Vzc2lvbiB0aW1lIGFsb25nIHRoZSB3ZWVrLgpIZXJlIHdlIGNhbiBzZWUgdGhhdCB3ZWVrZW5kcyBoYXZlIGFuIGludGVyc2Vzc2lvbiB0aW1lIHdheSBiaWdnZXIgdGhhbiB3ZWVrZGF5cywgdGhpcyAKY291bGQgYmUgY2F1c2VkIGJ5IHVzZXJzIGdvaW5nIG91dCBvZiBQb3J0byBvbiB0aGUgd2Vla2VuZHMsIHJlYWNoaW5nIG91dCBvdXIgZnJvbnRpZXIuIApgYGB7ciBlY2hvPUZBTFNFfQpwIDwtIGdncGxvdChkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0LCBhZXMoeCA9IHdlZWtkYXlzKHRpbWUpLCB5ID0gaW50ZXJzZXNzaW9uX3RpbWUsIGZpbGwgPSBpbnRlcmFjdGlvbih3ZWVrZGF5cyh0aW1lKSkgKSkgKyAKICBnZW9tX2JveHBsb3QoKSArIAogIHhsYWIoIkRheXMgb2YgdGhlIHdlZWsiICkgKwogIHlsYWIoIkludGVyc2Vzc2lvbiB0aW1lIChtaW5zKSIpICsKICBnZ3RpdGxlKCJJbnRlcnNlc3Npb24gdGltZShtaW4pIGluIHRoZSB3ZWVrICIpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJEb21pbmdvIiwgIlNlZ3VuZGEiLCAiVGVyw6dhIiwgIlF1YXJ0YSIsICJRdWludGEiLCAKICAgICJTZXh0YSIsICJTw6FiYWRvIikpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDAwMCkpCgoKcCA8LSBwbG90bHlfYnVpbGQocCkKcAoKYGBgCgoKYGBge3IgZWNobz1GQUxTRSwgZXZhbD0gRkFMU0V9CiMgSGlzdG9ncmFtIGludGVyc2Vzc2lvbiB0aW1lLgppbnQyIDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lCiAgZmlsdGVyKCBpbnRlcnNlc3Npb25fdGltZSAhPSAwKSAlPiUgCiAgZ2dwbG90KGFlcyhpbnRlcnNlc3Npb25fdGltZS82MCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA5KSArIAogIGdndGl0bGUoIkludGVyc2Vzc2lvbiB0aW1lIChob3VycykiKSArCiAgeGxhYigiSG91cnMiKSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW09YygwLDIwMCkpCmdncGxvdGx5KGludDIpCgoKYGBgCgpOdW1iZXIgb2Ygc2Vzc2lvbnMgcGVyIGVkZ2UuCldlIGNhbiBzZWUgdGhlIGxpbWl0YXRpb25zIGluIG91ciBkYXRhIHdoZW4gbW9zdCBvZiB0aGUgZWRnZXMgaGF2ZSBsZXNzIHRoYW4gNSBzZXNzaW9ucwppbiB0aGUgd2hvbGUgbW9udGgsIG1vc3RseSBldmVuIGhhdmluZyBqdXN0IDEuIApJbiBuZXh0IGNoYXB0ZXJzIHdlIHdpbGwgc3R1ZHkgbW9yZSB0aGUgZWRnZXMgd2l0aCBtb3JlIHRoYW4gNTAgc2Vzc2lvbnMuIAoKYGBge3IgZWNobz1GQUxTRSwgIG1lc3NhZ2U9RkFMU0V9CmludDEgPC0gZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgZ3JvdXBfYnkod2F5X2lkKSAlPiUgCiAgc3VtbWFyaXNlKG5fc2Vzc2lvbnMgPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPW5fc2Vzc2lvbnMpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMCkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLDE1MCkpICsKICBnZ3RpdGxlKCJOdW1iZXIgb2Ygc2Vzc2lvbnMgcGVyIHdheV9pZCBpbiBQb3J0byIpICsKICB4bGFiKCJOdW1iZXIgb2Ygc2Vzc2lvbnMiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNTAsIHNpemUgPSAxLCBjb2xvdXIgPSAiI0ZGMzcyMSIsCiAgICAgICAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiKQoKZ2dwbG90bHkoaW50MSkKYGBgCgojIyMgQW5hbGl6aW5nIGVkZ2VzID41MCBzZXNzaW9ucy4gIAoqIGhvdGVkZ2VzIC0+IG1vcmUgNTAgc2Vzc2lvbnMuIDM1Mzcgc2Vzc2lvbnMgaW4gdG90YWwuCiogc3VwZXJob3RfZWRnZXMgLT4gbW9yZSAxNzAgc2Vzc2lvbnMuIDEzNjkgc2Vzc2lvbnMgaW4gdG90YWwuIAoKYGBge3IgZWNobz1GQUxTRX0KI0NyZWF0ZSBkZiB3aXRoIHdheV9pZHMgd2l0aCA+NTAgc2Vzc2lvbnMKCmRmX2lkX2hvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBzdW1tYXJpc2Uobl9zZXNzaW9ucyA9IG4oKSkgJT4lICAKICBmaWx0ZXIobl9zZXNzaW9ucyA+PSA1MCkgCgpkZl9ob3RlZGdlc19hcHJpbDE2cHQgPC0gZGZfaWRfaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBtZXJnZSh5PSBkZl9lZGdlc19hcHJpbDE2cHQsIGJ5PSJ3YXlfaWQiKQoKI0NyZWF0ZSBkZiB3aXRoIHdheV9pZHMgd2l0aCA+MTcwIHNlc3Npb25zIAojVGhpcyBpcyBOTyBMT05HRVIgdXNlZC4gCiNVcGRhdGVkIHdpdGggZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgY3JlYXRlZCBpbiAgcHJlYW5hbHlzaXNfY291cnNlLlJtZApkZl9pZF9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBzdW1tYXJpc2Uobl9zZXNzaW9ucyA9IG4oKSkgJT4lICAKICBmaWx0ZXIobl9zZXNzaW9ucyA+PSAxNzApIAoKZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgPC0gZGZfaWRfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIG1lcmdlKHk9IGRmX2VkZ2VzX2FwcmlsMTZwdCwgYnk9IndheV9pZCIpCgpuX2Rpc3RpbmN0KGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCRzZXNzaW9uX2lkKQpgYGAKCiMjIyMjIFBvaW50cyAocHJvYmFibHkgdG8gZGVsZXRlKSAKVGhpcyBzZWN0aW9uIGlzIG5lZWRlZCB0byB0aGVuIG1hcC4gTWFwcyB0aGUgYW1vdW50IG9mIHBvaW50cy4KSXQgaXMgYmV0dGVyIHRvIG1hcCB3aXRoIG51bWJlciBvZiBzZXNzaW9ucy4gCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9IAojIFBPSU5UUyBmb3IgbWFwcGluZwoKI0FsbCB3aXRoIHNlc3Npb25zID4gNTAKZGZfcG9pbnRzX2hvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBzdW1tYXJpc2Uobl9zZXNzaW9ucyA9IG4oKSkgJT4lIAogIGZpbHRlcihuX3Nlc3Npb25zID49IDUwKSAlPiUgCiAgbWVyZ2UoIHkgPSBkZl9wb2ludHNfZWRnZV9vc21fYXByaWwxNnB0LCBieSA9ICJ3YXlfaWQiKSAKCmRmX3BvaW50c19zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBzdW1tYXJpc2Uobl9zZXNzaW9ucyA9IG4oKSkgJT4lIAogIGZpbHRlcihuX3Nlc3Npb25zID49IDE3MCkgJT4lIAogIG1lcmdlKCB5ID0gZGZfcG9pbnRzX2VkZ2Vfb3NtX2FwcmlsMTZwdCwgYnkgPSAid2F5X2lkIikgCgoKZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgPC1tdXRhdGUoZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQsIGNsYXNzID0gaWZlbHNlKGhvdXIodGltZSkgPj03ICYgaG91cih0aW1lKSA8PSAyMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAibmlnaHQiKSkKKCkKI0RheQpkZl9wb2ludHNfaG90ZWRnZXNfYXByaWwxNnB0X2QgPC0gZGZfaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoaG91cih0aW1lKSA+PTcsIGhvdXIodGltZSk8PSAyMCwgbl9zZXNzaW9ucyA+PSA1MCkgJT4lIAogIG1lcmdlKCB5ID0gZGZfcG9pbnRzX2VkZ2Vfb3NtX2FwcmlsMTZwdCwgYnkgPSAid2F5X2lkIikgCgojIE5pZ2h0CmRmX3BvaW50c19hcHJpbDE2cHRfbmlnaHRfbiA8LSBkZl9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlcihob3VyKHRpbWUpIDw3IHwgaG91cih0aW1lKSA+IDIwLCBuX3Nlc3Npb25zID49IDIwKSAlPiUgCiAgbWVyZ2UoIHkgPSBkZl9wb2ludHNfZWRnZV9vc21fYXByaWwxNnB0LCBieSA9ICJ3YXlfaWQiKSAKCmBgYAoKIyMjIEVDREYgCk9ubHkgMjUlIGlzIHVuZGVyIDFoIGludGVyc2Vzc2lvbiB0aW1lLiAKYGBge3IgZWNobz1GQUxTRX0KZTEgPC0gZ2dwbG90KHN1YnNldChkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0LCBpbnRlcnNlc3Npb25fdGltZSA+IDApLCBhZXMoaW50ZXJzZXNzaW9uX3RpbWUpKSArIAogIHN0YXRfZWNkZihnZW9tID0gInN0ZXAiKSArCiAgeGxhYigiSW50ZXJzZXNzaW9uIHRpbWUobWlucykiKQoKZTIgPC0gZ2dwbG90KHN1YnNldChkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0LCBpbnRlcnNlc3Npb25fdGltZSA+IDApLCBhZXMoaW50ZXJzZXNzaW9uX3RpbWUpKSArIAogIHNjYWxlX3hfbG9nMTAoKSArc3RhdF9lY2RmKGdlb20gPSAic3RlcCIpICArIHhsYWIoIkludGVyc2Vzc2lvbiB0aW1lIExvZyIpCgpncmlkLmFycmFuZ2UoZTEsIGUyLCBuY29sPSAyLCB0b3AgPSAiSW50ZXJzZXNzaW9uIHRpbWUgYWxsIHNlc3Npb25zIFBvcnRvIChtaW5zKSIpCmBgYAogCkFzIGV4cGVjdGVkLCB0aGVyZSBpcyBoaWdoZXIgaW50ZXJzZXNzaW9uIHRpbWUgYXQgbmlnaHQuIApgYGB7ciBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQojIENsYXNzaWZ5aW5nIHBvaW50cyBieSBkYXkgZm9yIEVDREYgCmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgPC1tdXRhdGUoZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCwgY2xhc3MgPSBpZmVsc2UoaG91cih0aW1lKSA+PTcgJiBob3VyKHRpbWUpIDw9IDIwLCAKICAgICAgICAgICAgICAgICAgICAgICAgImRheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuaWdodCIpKQoKZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgZmlsdGVyKGludGVyc2Vzc2lvbl90aW1lID4wKSAlPiUgCiAgc3Vic2V0KHdheV9pZCAlaW4lIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCR3YXlfaWQpICU+JSAKICBnZ3Bsb3QoIGFlcyhpbnRlcnNlc3Npb25fdGltZSwgY29sb3I9IGNsYXNzICkpICsgCiAgc2NhbGVfeF9sb2cxMCgpICsgCiAgc3RhdF9lY2RmKGdlb20gPSAic3RlcCIpICsgCiAgZ2d0aXRsZSgiSW50ZXJzZXNzaW9uIHRpbWUgPjUwIHNlc3Npb25zIFBvcnRvIikKYGBgCgoKRUNERiBieSAjc2Vzc2lvbnMgCgpgYGB7ciBlY2hvPUZBTFNFfQpkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBzdW1tYXJpc2Uoc2Vzc2lvbnMgPSBuKCkgKSAlPiUgCiAgZ2dwbG90KGFlcyhzZXNzaW9ucykpICsgCiAgc2NhbGVfeF9sb2cxMCgpICsgc3RhdF9lY2RmKGdlb20gPSAic3RlcCIpICsKICBnZ3RpdGxlKCJFQ0RGIG51bWJlciBvZiBzZXNzaW9ucyBhbGwgUG9ydG8iKQogIApgYGAKCiMjIyAgRWRnZXMgd2l0aCA+NTAgc2Vzc2lvbnMuIAoKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQpsb3cxIDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIHN1YnNldCh3YXlfaWQgJWluJSBkZl9ob3RlZGdlc19hcHJpbDE2cHQkd2F5X2lkKSAlPiUgCiAgc3Vic2V0KCBpbnRlcnNlc3Npb25fdGltZSA8IHF1YW50aWxlKGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQkaW50ZXJzZXNzaW9uX3RpbWUsIDAuMzUpKSAlPiUgCiAgZ2dwbG90KGFlcyhpbnRlcnNlc3Npb25fdGltZSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzApICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDIwMCwxMCkpKwogIHhsYWIoIkludGVyc2Vzc2lvbiB0aW1lIChtaW5zKSIpICsgCiAgZ2d0aXRsZSgiTG93ZXN0IDM1JSBpbnRlcnNlc3Npb24gdGltZSA+NTAiKQoKZ2dwbG90bHkobG93MSkKYGBgCgoKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQpjMSA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBzdWJzZXQod2F5X2lkICVpbiUgZGZfaG90ZWRnZXNfYXByaWwxNnB0JHdheV9pZCkgJT4lIAogIGdncGxvdChhZXMoaW50ZXJzZXNzaW9uX3RpbWUsIGZpbGwgPSBjbGFzcykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oKSArIAogIHhsYWIoIkludGVyc2Vzc2lvbiB0aW1lIChtaW4pIikgKwogIHhsaW0oYygwLDMwMDApKSArCiAgeWxpbShjKDAsNTAwMCkpICsKICBnZ3RpdGxlKCJJbnRlcnNlc3Npb24gdGltZSA+NTAgZGF5L25pZ2h0IikKCmdncGxvdGx5KGMxKSAKYGBgCgoKCiMjIyBTaG93aW5nIG1hcHMgCgpUcmFmZmljICBNYXAgQXByaWwgUG9ydG8gMjAxNiBhbGwKYGBge3IgZXZhbD0gVFJVRX0KIyBTaG93aW5nIE1hcC4KbTEgPC0gbQptMQojbWFwc2hvdChtLCB1cmwgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9tYXAuaHRtbCIpKQpgYGAKClRyYWZmaWMgIE1hcCBBcHJpbCAyMDE2IGFsbCA+NTAKYGBge3IgZWNobz1GQUxTRX0KbV81MCA8LSBtCm1fNTAgCmBgYAoKClRvcCBlZGdlcyAKCmBgYHtyIGVjaG89RkFMU0V9Cm1faG90IDwtIG0KbV9ob3QKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfQptXzEwMCA8LSBtCm1fMTAwCmBgYAoKCiMjIyBOdW1iZXIgb2Ygc2Vzc2lvbnMgYW5hbHlzaXMuCiMjIyMgRGF5IG9mIHRoZSB3ZWVrIApgYGB7ciBlY2hvPSBGQUxTRX0gCnBsb3Qubl9zZXNzaW9ucyhkZl9zcGVlZCxkZl9ob3RlZGdlc19hcHJpbDE2cHQsIGRmX3NwZWVkX3RvcCwgd2RheSkgKyAKICB4bGFiKCJEYXkgb2YgdGhlIHdlZWsiKSAgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiRG9taW5nbyIsICJTZWd1bmRhIiwgIlRlcsOnYSIsICJRdWFydGEiLCAiUXVpbnRhIiwgCiAgICAiU2V4dGEiLCAiU8OhYmFkbyIpKSAKCmBgYAoKIyMjIyBCeSBkYXkgCmBgYHtyIGVjaG89IEZBTFNFfQpwbG90Lm5fc2Vzc2lvbnMoZGZfc3BlZWQsIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCwgZGZfc3BlZWRfdG9wLCBkYXkpICsgCiAgeGxhYigiRGF5IikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMSwzMCwxKSkgCmBgYAoKIyMjIyBCeSBob3VyIApgYGB7ciBlY2hvPSBGQUxTRX0gCnBsb3Qubl9zZXNzaW9ucyhkZl9zcGVlZCxkZl9ob3RlZGdlc19hcHJpbDE2cHQsIGRmX3NwZWVkX3RvcCwgaG91cikgKyAKICB4bGFiKCJIb3VyIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwyMywxKSkgCmBgYAoKCgoKCgojIyBTcGVlZCA+NTAKCmBgYHtyfQojIFNwZWVkIGJ5IHdheV9pZCBhbmQgc2Vzc2lvbi5cCmRmX3NwZWVkICU+JSAKICBzdWJzZXQod2F5X2lkICVpbiUgZGZfaG90ZWRnZXNfYXByaWwxNnB0JHdheV9pZCkgJT4lIAogIGdyb3VwX2J5KHdheV9pZCkgJT4lIAogIHN1bW1hcmlzZShhdmdfc3BlZWQgPSBtZWFuKChzcGVlZCoxOCkvNSksIG4gPSBuKCkgKSAlPiUgCiAgZ2dwbG90KCBhZXMoYXZnX3NwZWVkKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMykgCmBgYAoKU3BlZWQgYnkgd2VlayAKYGBge3IgZWNobz1GQUxTRX0KcGxvdC5zcGVlZChkZl9zcGVlZCxkZl9ob3RlZGdlc19hcHJpbDE2cHQsIGRmX3NwZWVkX3RvcCwgd2RheSwgbWVkaWFuKSArIAogIHhsYWIoIkRheSBvZiB0aGUgd2VlayIpICArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJEb21pbmdvIiwgIlNlZ3VuZGEiLCAiVGVyw6dhIiwgIlF1YXJ0YSIsICJRdWludGEiLCAKICAgICJTZXh0YSIsICJTw6FiYWRvIikpIApgYGAKClNwZWVkIGJ5IGRheQoKYGBge3IgZWNobz1GQUxTRX0KcGxvdC5zcGVlZChkZl9zcGVlZCwgZGZfaG90ZWRnZXNfYXByaWwxNnB0LCBkZl9zcGVlZF90b3AsIGRheSkgKyAKICB4bGFiKCJEYXkiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxLDMwLDEpKSAKCmBgYAoKU3BlZWQgYnkgaG91cgpgYGB7ciBlY2hvPUZBTFNFfQpwbG90LnNwZWVkKGRmX3NwZWVkLGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCwgZGZfc3BlZWRfdG9wLCBob3VyKSArIAogIHhsYWIoIkhvdXIiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDIzLDEpKSAKYGBgCgojIwpOdW1iZXIgb2Ygc2Vzc2lvbiBwZXIgaG91cgpgYGB7ciBlY2hvPUZBTFNFfQpkZl9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogICAgZmlsdGVyKHdkYXkodGltZSkgIT0gMSAsIHdkYXkodGltZSkgIT0gNyApICU+JSAKICAgIGdyb3VwX2J5KGhvdXIgPWhvdXIodGltZSkpICU+JSAKICAgIHN1bW1hcmlzZShzZXNzaW9ucyA9IG5fZGlzdGluY3Qoc2Vzc2lvbl9pZCkpICU+JSAKICBnZ3Bsb3QoYWVzKGhvdXIsIHNlc3Npb25zKSkgKyAKICBnZW9tX2xpbmUoKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMjMsMSkpCmBgYAoKRWRnZXMgcGVyIGhhbGYgaG91cgpgYGB7cn0KcHJ1ZWJhIDwtIHRhYmxlKGN1dChmaWx0ZXIoZGZfaG90ZWRnZXNfYXByaWwxNnB0LCBkYXkodGltZSkgPCA3KSR0aW1lLCBicmVha3MgPSAiMzAgbWlucyIpKQpwbG90KHBydWViYSwgeGxhYiA9ICJkYXRlIiwgeWxhYiA9ICJmcmVxdWVuY3kiKSAKYGBgCgo=